#include <algorithm>
#include <vector>
using namespace std;
class Solution
{
public:
    int serach(int target, int l, int r, vector<int> &add)
    {
        int d = add[r];
        while (l < r)
        {
            // 找第一个不满足 s-add[r+1]>=t的
            int mid = (l + r) >> 1;
            int s = d - add[mid];
            if (s >= target)
                l = mid + 1;
            else
                r = mid;
        }
        return l;
    }
    int minSubArrayLen(int target, vector<int> &nums)
    {
        // 预留一个位置进行前缀和来判断二分是否失败
        vector<int> add(nums.size() + 1);
        for (int i = 1; i < add.size(); i++)
            add[i] += add[i - 1] + nums[i - 1];
        // 遍历+二分 N*logN
        int res = INT_MAX;
        for (int i = add.size() - 1; i >= 0; i--)
        {
            int p = serach(target, 0, i, add);
            if (p)
            {
                res = min(res, i - p + 1);
            }
        }
        return res == INT_MAX ? 0 : res;
    }
};